package com.sc.thread.threadcommunication;

/**
 * Created by Shen Chao on 2018-07-03-003.
 * <p>
 * 共享资源和操作
 */
public class ShareCached {
    //使用char字符，作为存储共享数据存储类型
    private char cache;
    //产品消耗标识，线程通信信号，true未消费(生产),false未生产(消费)
    private boolean flag = false;

    /**
     * 生产操作：共享数据添加
     *
     * @param data
     */
    public synchronized void addShareCachedData(char data) {
        //产品未消费，则生产者等待
        if (flag) {
            System.out.println("产品未消费，生产者等待");
            try {
                //等待
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //产品已消费，继续生产
        this.cache = data;
        //标记已生产
        flag = true;
        //通知消费者消费
        notify();
        System.out.println("产品" + data + "已生产，通知消费者消费");
    }

    /**
     * 消费操作：共享数据获取
     */
    public synchronized char getShareCachedData() {
        //产品未生产，消费者等待
        if (!flag) {
            System.out.println("产品未生产，消费者等待");
            try {
                //等待
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //标记已消费
        flag = false;
        //通知消费者消费
        notify();
        System.out.println("产品" + cache + "已消费，通知生产者生产");
        return cache;
    }
}
